﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlServerCe;
using System.Data;

namespace GestionaleLib.Controller
{
    public class ctrlProtocolli
    {
        #region "Testata"
        #region "Proprietà"
        private Connector Connessione;
        #endregion
        public enum Insert
        {
            Successo,
            Errore
        }
        public enum Edit
        {
            Successo,
            Errore
        }
        public enum Delete
        {
            Successo,
            Errore
        }
        #endregion

        public ctrlProtocolli()
        {
            Connessione = Connector.Istance();
        }
        /// <summary>
        /// Restituisce il progressivo inserito di un determinato protocollo
        /// </summary>
        /// <param name="Protocollo"></param>
        /// <returns></returns>
        public int UltimoProgressivo(Protocollo Protocollo)
        {
            int Prog;
            string sql = @"
                SELECT Progressivo FROM Protocollo
                    WHERE Nome='"+Protocollo.Nome+"'";
            SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);
            Prog = Convert.ToInt32(cmd.ExecuteScalar());
            return Prog;
        }
        /// <summary>
        /// Verifica se un determinato protocollo esiste già
        /// </summary>
        /// <param name="Protocollo"></param>
        /// <returns></returns>
        private bool ProtocolloEsistente(Protocollo Protocollo)
        {
            try
            {
                string sql = @"
                    SELECT Nome FROM Protocollo 
                        WHERE Nome=@Nome
                ";
                SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);
                cmd.Parameters.AddWithValue("@Nome", Protocollo.Nome);
                string NomeTemp =(string)cmd.ExecuteScalar();
                if (!NomeTemp.Equals(""))
                    return true;
                return false;
            }
            catch
            {
                throw new ExceptionElementoGiaPresente();
            }
        }
        /// <summary>
        /// Inserisce una nuova riga di protocollo
        /// </summary>
        /// <param name="Protocollo"></param>
        /// <returns></returns>
        public Insert Nuovo(Protocollo Protocollo)
        {
            //se il protocollo esiste gia' genera un eccezione

            //if (ProtocolloEsistente(Protocollo)) { throw new ExceptionElementoGiaPresente(); }

            try
            {
                string sql = @"
                INSERT INTO Protocollo 
                    VALUES (@Id,@Nome,@Protocollo,@DataAggiornamento)
                ";
                SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);
                cmd.Parameters.AddWithValue("@Id", (Guid)Protocollo.Id);
                cmd.Parameters.AddWithValue("@Nome", Protocollo.Nome);
                cmd.Parameters.AddWithValue("@Protocollo", Protocollo.Progressivo);
                cmd.Parameters.AddWithValue("@DataAggiornamento", Protocollo.DataAggiornamento);
                cmd.ExecuteNonQuery();
                return Insert.Successo;
            }
            catch
            {
                throw new ExceptionErroreInserimento();
            }

        }
        /// <summary>
        /// Modifica una riga di protocollo tramite id
        /// </summary>
        /// <param name="Protocollo"></param>
        /// <returns></returns>
        public Edit Modifica(Protocollo Protocollo)
        {
            try
            {
                //se il protocollo esiste gia' genera un eccezione
                if (ProtocolloEsistente(Protocollo)) { throw new ExceptionElementoGiaPresente(); }

                string sql = @"
                UPDATE Protocollo SET 
                        Nome=@Nome,Protocollo=@Protocollo,DataAggiornamento=@DataAggiornamento
                    WHERE Id=@Id
                ";
                SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);
                cmd.Parameters.AddWithValue("@Id", (Guid)Protocollo.Id);
                cmd.Parameters.AddWithValue("@Nome", Protocollo.Nome);
                cmd.Parameters.AddWithValue("@Protocollo", Protocollo.Progressivo);
                cmd.Parameters.AddWithValue("@DataAggiornamento", Protocollo.DataAggiornamento);
                cmd.ExecuteNonQuery();
                return Edit.Successo;
            }
            catch
            {
                throw new ExceptionErroreModifica();
            }
        }
        /// <summary>
        /// Aggiorna il progressivo di un determinato protocollo
        /// Il numero di progressivo viene incrementato di 1 automaticamente
        /// </summary>
        /// <returns></returns>
        public Edit AggiornaProgressivo(Protocollo Protocollo)
        {
            try
            {
                int UltimoProgressivoDelProtocollo = UltimoProgressivo(Protocollo);
                string sql = @"
                    UPDATE Protocollo SET 
                        Progressivo=" + UltimoProgressivoDelProtocollo + " WHERE Nome='" 
                                      + Protocollo.Nome + "' DataAggiornamento='" + DateTime.Now + "'";
                SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);
                cmd.ExecuteNonQuery();
                return Edit.Successo;
            }
            catch
            {
                throw new ExceptionErroreModifica();
            }
        }
        /// <summary>
        /// Cancella una riga di protocollo by Id
        /// </summary>
        /// <param name="Protocollo"></param>
        /// <returns></returns>
        public Delete Cancella(Protocollo Protocollo)
        {
            try
            {
                string sql = @"
                    DELETE FROM Protocollo
                        WHERE Id=@Id
                    ";
                SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);
                cmd.Parameters.AddWithValue("@Id", (Guid)Protocollo.Id);
                cmd.ExecuteNonQuery();
                return Delete.Successo;
            }
            catch (Exception)
            {
                throw new ExceptionErroreCancellazione();
            }
        }
        /// <summary>
        /// Seleziona tutti i tipi di protocollo esistenti nel db
        /// </summary>
        /// <returns></returns>
        public List<Protocollo> Seleziona()
        {
            string sql = @"
                SELECT * FROM Protocollo 
                    ORDER BY Nome ASC 
            ";
            SqlCeDataAdapter com = new SqlCeDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            List<Protocollo> ListaRitorno = new List<Protocollo>();
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow item in dt.Rows)
                {
                    Protocollo ProtocolloRitorno = new Protocollo();
                    ProtocolloRitorno.Id = (Guid)item["Id"];
                    ProtocolloRitorno.Nome = item["Nome"].ToString();
                    ProtocolloRitorno.Progressivo = (int)item["Progressivo"];
                    ProtocolloRitorno.DataAggiornamento = (DateTime)item["DataAggiornamento"];
                    ListaRitorno.Add(ProtocolloRitorno);
                }
                return ListaRitorno;
            }
            return null;
        }
        /// <summary>
        /// Seleziona il protocollo con un determinato NOME
        /// </summary>
        /// <returns></returns>
        public bool Seleziona(string Nome, Protocollo ProtocolloRitorno)
        {
            string sql = @"
                SELECT * FROM Protocollo 
                    WHERE Nome='" + Nome + "'";

            SqlCeDataAdapter com = new SqlCeDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            List<Protocollo> ListaRitorno = new List<Protocollo>();
            if (dt.Rows.Count > 0)
            {
                //ProtocolloRitorno = new Protocollo();
                ProtocolloRitorno.Id = (Guid)dt.Rows[0]["Id"];
                ProtocolloRitorno.Nome = dt.Rows[0]["Nome"].ToString();
                ProtocolloRitorno.Progressivo = (int)dt.Rows[0]["Progressivo"] + 1;
                ProtocolloRitorno.DataAggiornamento = (DateTime)dt.Rows[0]["DataAggiornamento"];

                return true;
            }
            else
            {
                return false;
            }
        }
    }
}
